#ifndef __SERIAL_H
#define __SERIAL_H

#include "stm32f10x.h"
#include <stdio.h>
#include <stdarg.h>

// 串口编号
typedef enum {
    SERIAL1,
    SERIAL2
} SerialPort;

// 回调函数类型
typedef void (*SerialByteCallback)(uint8_t byte);
typedef void (*SerialMatchCallback)(uint8_t byte);

// 每个串口的实例
typedef struct {
    USART_TypeDef* usart;
    uint8_t rx_buffer[128];           // 接收缓冲区
    volatile uint32_t rx_head;        // 写入位置（中断更新）
    volatile uint32_t rx_tail;        // 读取位置（用户更新）
    uint8_t buffer_full_flag;

    // 回调
    SerialByteCallback onByteReceived;
    SerialMatchCallback onByteMatched;
    uint8_t match_byte;

} Serial_t;

// 全局实例数组（支持多个串口）
extern Serial_t g_serials[2];  // [0] = USART1, [1] = USART2

// API（全部带 port 参数）
void serial_begin(SerialPort port, uint32_t baudrate);
void serial_end(SerialPort port);

int serial_available(SerialPort port);
int serial_read(SerialPort port);
void serial_write(SerialPort port, uint8_t byte);
void serial_print(SerialPort port, const char* str);
void serial_println(SerialPort port, const char* str);
void serial_printf(SerialPort port, const char* format, ...);

// 回调设置
void serial_onByteReceived(SerialPort port, SerialByteCallback callback);
void serial_onByteMatched(SerialPort port, SerialMatchCallback callback, uint8_t match_byte);

// 中断服务接口（供 stm32f10x_it.c 调用）
void serial_irq_handler_usart1(void);
void serial_irq_handler_usart2(void);

#endif
